package cn.yza.设计模式.代理模式.动态代理.demo01;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

/** 动态代理优势：其实动态代理与静态代理的本质一样，最终程序运行时都需要生成一个代理对象实例，
 * 通过它来完成相关增强以及业务逻辑，只不过静态代理需要硬编码的方式指定，
 * 而动态代理则是以动态方式生成代理(有编译时操作字节码生成的方式、运行时通过反射、字节码生成的方式)。
 * 动态生成的好处很明显，代理逻辑与业务逻辑是互相独立的，没有耦合，代理1个类或100个类要做的事情没有任何区别

 说到耦合，必须把AOP拿来说道说道：传统面向对象思想中，如果想要实现功能复用，要么继承、要么引用，
 无论哪种方式，对代码都有一定的侵入性，耦合无可避免，侵入性啥意思？
 简单来说：如果你想要用它增强你程序的功能，你必须改动你的程序代码，
 那它就具有侵入性。如果只有一点两点需要增强还好说，如果大量的功能点需要被增强，
 工作量就会很大，代码也不太优雅。想象一下，如果你对外公开了一系列的接口，现在领导说了，
 接口要加权限控制。在哪加？最笨的当然就是写个程序验证的逻辑，然后每个接口都拿来调用一遍。
 这也正是面向对象思想的短板，在要为程序新增一些通用功能时，只能通过耦合的方式才能进行。
 AOP正是为此而生，AOP旨在通过一种无耦合的方式来为程序带来增强。而动态代理，就是AOP实现方式中的一种
 * @author Honglixi
 * @create 2021-11-01 18:50
 */
public class MainShop {
    public static void main(String[] args) {
        //创建代理对象。使用Proxy

        //1.创建目标对象
        UsbSell factory = new UsbFactory();

        //2.创建Invocationhandler对象
        InvocationHandler handler = new MySellHandler(factory);

        //3.创建代理对象
        UsbSell proxy = (UsbSell) Proxy.newProxyInstance(factory.getClass().getClassLoader(),
                factory.getClass().getInterfaces(),
                handler);
        //4.通过代理执行方法
        float price = proxy.sell(1);
        System.out.println("通过动态代理" + price);
    }
}
